const fs = require('fs');
const path = require('path');
const { AIRole } = require('../models');

/**
 * 清理uploads目录中未被使用的图片文件
 * @param {boolean} dryRun - 是否为试运行模式（只检查不删除）
 * @returns {Promise<Object>} 清理结果
 */
async function cleanupUnusedImages(dryRun = true) {
  try {
    const uploadsDir = path.join(__dirname, '..', 'public', 'uploads');
    const results = {
      totalFiles: 0,
      unusedFiles: [],
      deletedFiles: [],
      errors: []
    };

    // 获取所有AI角色的头像路径
    const roles = await AIRole.findAll({
      attributes: ['avatar'],
      where: {
        avatar: {
          [require('sequelize').Op.not]: null
        }
      }
    });

    const usedAvatars = new Set();
    roles.forEach(role => {
      if (role.avatar && role.avatar.startsWith('/uploads/')) {
        // 提取文件名
        const filename = path.basename(role.avatar);
        usedAvatars.add(filename);
      }
    });

    // 扫描uploads目录
    if (!fs.existsSync(uploadsDir)) {
      console.log('uploads目录不存在');
      return results;
    }

    const files = fs.readdirSync(uploadsDir);
    results.totalFiles = files.length;

    for (const file of files) {
      const filePath = path.join(uploadsDir, file);
      const stat = fs.statSync(filePath);

      // 跳过目录和特殊文件
      if (stat.isDirectory() || file === '.gitkeep' || file === 'README.md') {
        continue;
      }

      // 检查文件是否被使用
      if (!usedAvatars.has(file)) {
        results.unusedFiles.push(file);
        
        if (!dryRun) {
          try {
            fs.unlinkSync(filePath);
            results.deletedFiles.push(file);
            console.log(`已删除未使用的文件: ${file}`);
          } catch (error) {
            results.errors.push({ file, error: error.message });
            console.error(`删除文件失败 ${file}:`, error);
          }
        }
      }
    }

    return results;
  } catch (error) {
    console.error('清理文件时发生错误:', error);
    throw error;
  }
}

/**
 * 获取文件大小（字节）
 * @param {string} filePath - 文件路径
 * @returns {number} 文件大小
 */
function getFileSize(filePath) {
  try {
    const stats = fs.statSync(filePath);
    return stats.size;
  } catch (error) {
    return 0;
  }
}

/**
 * 获取uploads目录统计信息
 * @returns {Promise<Object>} 目录统计信息
 */
async function getUploadsStats() {
  try {
    const uploadsDir = path.join(__dirname, '..', 'public', 'uploads');
    const stats = {
      totalFiles: 0,
      totalSize: 0,
      usedFiles: 0,
      unusedFiles: 0
    };

    if (!fs.existsSync(uploadsDir)) {
      return stats;
    }

    // 获取所有使用中的头像
    const roles = await AIRole.findAll({
      attributes: ['avatar'],
      where: {
        avatar: {
          [require('sequelize').Op.not]: null
        }
      }
    });

    const usedAvatars = new Set();
    roles.forEach(role => {
      if (role.avatar && role.avatar.startsWith('/uploads/')) {
        const filename = path.basename(role.avatar);
        usedAvatars.add(filename);
      }
    });

    const files = fs.readdirSync(uploadsDir);
    
    for (const file of files) {
      const filePath = path.join(uploadsDir, file);
      const stat = fs.statSync(filePath);

      if (stat.isFile() && file !== '.gitkeep' && file !== 'README.md') {
        stats.totalFiles++;
        stats.totalSize += stat.size;
        
        if (usedAvatars.has(file)) {
          stats.usedFiles++;
        } else {
          stats.unusedFiles++;
        }
      }
    }

    return stats;
  } catch (error) {
    console.error('获取目录统计信息失败:', error);
    throw error;
  }
}

module.exports = {
  cleanupUnusedImages,
  getFileSize,
  getUploadsStats
};